# -*- coding: utf-8 -*-
# Create your views here.
from buscador.forms import InstitucionBuscarForm
from datos_taxonomicos.models import Especie
from detalles_especie.models import DetalleEspecie
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response, redirect
from django.template import RequestContext
from django.views.generic.create_update import update_object, create_object, \
    delete_object
from django.views.generic.list_detail import object_list, object_detail
from documentos.models import Documento
from expertos.models import Experto
from forms import InstitucionForm
from instituciones.models import Institucion
from proyectos.models import Proyecto
from publicaciones.models import Publicacion
from usuarios.models import Usuario
from usuarios.permisos import es_del_grupo_de_expertos

def listar(request):    #seria la pagina de inicio para las instituciones
    return object_list(request,
                       queryset = Institucion.objects.all(),
                       allow_empty = True,
                       template_name = 'instituciones/listar.html'
                       )
    
def filtrar(request):    #seria la pagina de inicio para las especies
    form = InstitucionBuscarForm()
    q = None
    if request.method == 'POST':
        form = InstitucionBuscarForm(request.POST)
        if form.is_valid():
            q = Institucion.objects
            if form.cleaned_data['nombre']:
                q = q.filter(nombre__icontains = form.cleaned_data['nombre'])
            if form.cleaned_data['tipo']:
                q = q.filter(tipo = form.cleaned_data['tipo'])
            if form.cleaned_data['campo']:
                q = q.filter(dato = form.cleaned_data['campo'])
            if form.cleaned_data['pais']:
                q = q.filter(pais = form.cleaned_data['pais'])
            if form.cleaned_data['linea']:
                q = q.filter(lineas_de_investigacion = form.cleaned_data['linea'])
            if q == Institucion.objects:
                q = None
    return object_list(request,
                       queryset = Institucion.objects.all(),
                       allow_empty = True,
                       extra_context = {'form' : form, 'instituciones' : q },
                       template_name = 'instituciones/filtrar.html'
                       )

@login_required
def ver(request, object_id):
    objetos_relacionados = {}
    institucion = get_object_or_404(Institucion, pk=object_id)
    if institucion:
        expertos = Experto.objects.filter(instituciones = institucion)
        proyectos = Proyecto.objects.filter(instituciones = institucion)
        documentos = Documento.objects.filter(institucion = institucion)
        publicaciones = Publicacion.objects.filter(instituciones = institucion)
        objetos_relacionados.update({'expertos' : expertos })
        objetos_relacionados.update({'proyectos' : proyectos })
        objetos_relacionados.update({'documentos' : documentos })
        objetos_relacionados.update({'publicaciones' : publicaciones })
    return object_detail(request,
                         queryset = Institucion.objects.all(),
                         template_object_name =  "Institucion",
                         template_name = 'instituciones/detalle.html',
                         extra_context = objetos_relacionados,
                         object_id = object_id
                         ) 
        
@login_required
def crear(request):
    c={}
    if request.method == 'POST':                            
        form = InstitucionForm(request.POST)
        form.fields['lineas_de_investigacion'].help_text = ''
        form.fields['dato'].help_text = ''                                                
        if form.is_valid():                                  
            new_institucion = form.save(commit=False)
            new_institucion.creador = get_object_or_404(Usuario,user=request.user) 
            for linea in form.cleaned_data['lineas_de_investigacion']:
                new_institucion.lineas_de_investigacion.add(linea)
            for dato in form.cleaned_data['dato']:
                new_institucion.dato.add(dato)     
            new_institucion.save()  
            return HttpResponseRedirect("/instituciones/")
    else:
        form = InstitucionForm()
        form.fields['lineas_de_investigacion'].help_text = ''
        form.fields['dato'].help_text = ''                          
        
    c.update({'user':request.user})  
    c.update(csrf(request))
    c.update({'form':form})
    c.update()                     
    return render_to_response("instituciones/crear.html", c,context_instance=RequestContext(request))


@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def crear_con_experto(request):
    c={}
    if request.method == 'POST':                            
        form = InstitucionForm(request.POST,request.FILES)                                                
        if form.is_valid():                                  
            new_inst = form.save(commit=False)
            try:
                new_inst.creador = request.user.get_profile().experto
                new_inst.save()
                form.save_m2m()  
            except:
                c.update({'error':u'No tiene perfil de Experto. La Institución no se guardó.'})
                c.update(csrf(request))
                c.update({'form':form}) 
                return render_to_response("instituciones/crear.html", c,context_instance=RequestContext(request))
            return HttpResponseRedirect('/instituciones/' + str(new_inst.pk))
    else:
        form = InstitucionForm()
        
    c.update(csrf(request))
    c.update({'form':form})                 
    return render_to_response("instituciones/crear.html", c,context_instance=RequestContext(request))



@login_required
def crear_automatico(request):
    return create_object(request,
                         model = Institucion, 
                         form_class = InstitucionForm,
                         template_name = 'instituciones/crear.html', 
                         post_save_redirect = '/instituciones/'
                         )
@login_required   
def editar_automatico(request,object_id):
    get_object_or_404(Institucion, pk = object_id)
    return update_object(request,
                         model = Institucion, 
                         form_class = InstitucionForm,
                         template_name = 'instituciones/editar.html', 
                         post_save_redirect = '/instituciones/'+ object_id,
                         object_id = object_id
                         ) 
     
@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def editar(request, object_id):
    institucion = get_object_or_404(Institucion, pk = object_id)
    if request.method == 'POST':
        form = InstitucionForm(request.POST, instance = institucion)
        form.fields['lineas_de_investigacion'].help_text = ''
        form.fields['dato'].help_text = ''
        if form.is_valid():                                  
            new_institucion = form.save(commit=False)
            new_institucion.creador = get_object_or_404(Usuario,user=request.user)
            for linea in form.cleaned_data['lineas_de_investigacion']:
                new_institucion.lineas_de_investigacion.add(linea)
            for dato in form.cleaned_data['dato']:
                new_institucion.dato.add(dato)
            new_institucion.save()
            return HttpResponseRedirect("/instituciones/")
            

    else:
        form = InstitucionForm(instance = institucion)
        form.fields['lineas_de_investigacion'].help_text = ''
        form.fields['dato'].help_text = ''
        

    return update_object(request,
                         model = Institucion,
                         extra_context = { 'form' : form, 'user' : request.user },
                         template_name = 'instituciones/editar.html', 
                         post_save_redirect = '/instituciones/' + object_id,
                         object_id = object_id
                         )


@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def eliminar(request, object_id):
    get_object_or_404(Institucion, pk=object_id)
    return delete_object(request,
                         model = Institucion, 
                         template_name = 'instituciones/confirmar_eliminar.html', 
                         post_delete_redirect = '/instituciones/',
                         object_id = object_id
                         )
